template<typename abstractType, typename concreteType>
class addConstructorToMap
{
public:
    static concreteType *productNew()
    {
        return new concreteType;
    }
    addConstructorToMap(const string &lookup = concreteType::typeName)
    {
        abstractType::initMap();
        abstractType::insertMap(lookup, productNew());
    }
};


static addConstructorToMap<Shoes, NiKeShoes> addNIKEShoesToTable;
static addConstructorToMap<Clothe, UniqloClothe> addUniqloClotheToTable;